package com.unytech.project.web.listener;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.unytech.project.common.Globals;

public class UserSessionListener implements HttpSessionListener, HttpSessionAttributeListener {
	private final Log logger = LogFactory.getLog(this.getClass());
	//这样的写法是行不通的，因为在servlet中是先加载SessionListener再初始化spring的，所以这里没法得到spring中维护的bean
//	@Resource private SystemParams systemParams;

	@Override
	public void sessionCreated(HttpSessionEvent hse) {
		logger.info("监听到SESSION的创建");
		String sessionid = hse.getSession().getId();
//		hse.getSession().setMaxInactiveInterval(5);
		logger.info("创建的SESSION的ID："+sessionid);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent hse) {
		logger.info("监听到SESSION的销毁");
		String sessionid = hse.getSession().getId();
		logger.info("销毁的SESSION的ID："+sessionid);
		
		Hashtable<String, HttpSession> contextsessions = (Hashtable<String, HttpSession>) hse.getSession().getServletContext().getAttribute(Globals.CONTEXT_ALLSESSIONS_KEY);
		if (contextsessions != null && contextsessions.size()>0) {
			for(Iterator<Entry<String, HttpSession>> ite = contextsessions.entrySet().iterator(); ite.hasNext();){   
				Map.Entry<String, HttpSession> entry = (Map.Entry<String, HttpSession>) ite.next();   
				String tempsessionkey = entry.getKey();   
				HttpSession tempsession = entry.getValue();
				if (tempsessionkey.substring(tempsessionkey.indexOf("_")+1).equals(sessionid)) {
					contextsessions.remove(tempsessionkey);
				}
			}
		}
	}
	
	@Override
	public void attributeAdded(HttpSessionBindingEvent hsbe) {
		logger.info("用户登录监听器：监听到SessionAttribute的添加");
		logger.info("sbe.getName():"+hsbe.getName());
		logger.info("sbe.getValue():"+hsbe.getValue());
		
//		if(hsbe.getName() != null && hsbe.getName().equals(Globals.SESSION_USERINSESSION_KEY)) {
//			
//			ApplicationContext appcon = WebApplicationContextUtils.getRequiredWebApplicationContext(hsbe.getSession().getServletContext());
//			SystemParams systemParams = (SystemParams) appcon.getBean("systemParams");
//			if (systemParams != null) {
//				LoginRecord loginrecord = new LoginRecord();
//				User curloginuser = (User) hsbe.getValue();
//				
//				//这里用Hashtable是因为线程安全，LinkHashTable可以实现顺序但是线程不安全不能在listener中使用
//				/**key的值是“User的ID+Session的ID”，对应的value是当前Session对象而不是User对象*/
//				Hashtable<String, HttpSession> contextsessions = (Hashtable<String, HttpSession>) hsbe.getSession().getServletContext().getAttribute(Globals.CONTEXT_ALLSESSIONS_KEY);
//				if (contextsessions != null) {    
//					if (contextsessions.size() < Integer.parseInt(systemParams.getContextmaxuser())) {
//						for(Iterator<Entry<String, HttpSession>> ite = contextsessions.entrySet().iterator(); ite.hasNext();){   
//							Map.Entry<String, HttpSession> entry = (Map.Entry<String, HttpSession>) ite.next();   
//							String tempsessionkey = entry.getKey();   
//							HttpSession tempsession = entry.getValue();
//							User tempuser = (User) tempsession.getAttribute(Globals.SESSION_USERINSESSION_KEY);  
//							  
//							//第一，如果系统配置为帐户本地登录则注销所有异地会话，则销毁异地会话，创建本地会话，并更新全局变量中的会话信息
//							if (curloginuser.getUserid().equals(tempuser.getUserid()) && systemParams.getSessioncontrol().equals(LoginControl.LOGOUTOTHERSESSIONS.toString().toLowerCase())) {
//							
//							//不完美的写法，因为这个方法将要被废除，考虑用其他方法实现，以代替预废除的方法
//							//sbe.getSession().getSessionContext().getSession(tempsessionkey).invalidate();
//							tempsession.invalidate();
//							//考虑这一步是不是要做，因为注销一个Session之后会被SessionAttributeRemoved监听到，全局变量的移除工作也将会在那里处理
//							contextsessions.remove(tempuser.getUserid()+"_"+tempsessionkey);
//							//在全局变量中添加当前登录用户所创建的SESSION
//							contextsessions.put(curloginuser.getUserid()+"_"+hsbe.getSession().getId(), hsbe.getSession());
//							}
//							
//							//第二，如果系统配置为帐户已经登录则不允许本地再次登录，禁止本地登录，清空本地会话信息
//							if (curloginuser.getUsername().equals(tempuser.getUsername()) && systemParams.getSessioncontrol().equals(LoginControl.UNENDABLENEWSESSION.toString().toLowerCase())) {		  
//								//注销本地SESSION
//								hsbe.getSession().invalidate();
//							}
//							
//							 //第三，如果系统配置为运行一个账户可以用多个异地会话，除去本地多浏览器登录重复写入contextsessions
//							if (curloginuser.getUsername().equals(tempuser.getUsername()) && systemParams.getSessioncontrol().equals(LoginControl.ENDABLEOTHERESSIONS.toString().toLowerCase())) {  
//								//记录另一个SESSION
//								contextsessions.put(curloginuser.getUserid()+"_"+hsbe.getSession().getId(), hsbe.getSession());
//							}
//						}
//					}
//					else
//					{
//						hsbe.getSession().removeAttribute(Globals.SESSION_USERINSESSION_KEY);
//						hsbe.getSession().setAttribute(Globals.SESSION_MESSAGE_KEY, "在线用户超过最大限制，请联系系统管理员！");
//					}
//				}
//				else
//				{    //全局变量为空，也就是说这个是第一个登录的用户	
//					contextsessions = new Hashtable<>();
//					hsbe.getSession().setAttribute(Globals.SESSION_USERINSESSION_KEY, curloginuser);    //写入用户SESSION
//				}
//			}
//			else
//			{
//				hsbe.getSession().removeAttribute(Globals.SESSION_USERINSESSION_KEY);
//				hsbe.getSession().setAttribute(Globals.SESSION_MESSAGE_KEY, "获取系统配置参数错误！");
//			}
//		}
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent hsbe) {
		logger.info("监听到SessionAttribute的移除");
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent hsbe) {
		logger.info("监听到SessionAttribute的替换");
	}

}
